package ink.tiptop.learn.convert.test;

import ink.tiptop.learn.pojo.po.OrderInfoPO;
import ink.tiptop.learn.pojo.po.UserBaseInfoPO;
import org.mapstruct.*;

import java.util.Date;
import java.util.Map;
import java.util.Set;
import java.util.function.Function;

/**
 * @author zjf
 * @date 2020-08-15 17:06
 * 常用的一些形式
 */
@Mapper
public interface A_UsualConvert {
    // -------------------列举几个其他的使用形式-------------------
    // 2020年08月14日21:44:27 zjf 测试OK
    @Mapping(source = "id", target = "id")
    @Mapping(source = "userId", target = "userId")
    UserOrderBO baseConvert(OrderInfoPO order);

    // 2020年08月14日21:40:49 zjf 测试OK
    @Mappings({
            @Mapping(source = "order.id", target = "id"),
            @Mapping(source = "user.id", target = "userId")
    })
    UserOrderBO convert2UserOrder(
            OrderInfoPO order, UserBaseInfoPO user);

    // 2020年08月14日21:47:15 zjf 测试OK
    void baseConvert(OrderInfoPO orderInfoPO, @MappingTarget UserOrderBO userOrderBO);

    // 自定义的转换方法
    default UserOrderBO defaultConvert(OrderInfoPO orderInfoPO) {
        UserOrderBO apply = ((Function<OrderInfoPO, UserOrderBO>) orderInfoPO1 ->
                new UserOrderBO()
                        .setId(orderInfoPO1.getId())
                        .setUserId(orderInfoPO1.getUserId()))
                .apply(orderInfoPO);
        return apply;
    }

    // 支持嵌套获取对象属性
    @Mappings({
            @Mapping(source = "user.id", target = "id"),
            @Mapping(source = "user.detail.user", target = "userId")
    })
    OrderInfoPO innerConvert(UserOrderBO user);

    // Integer可以映射成String,生成的代码会String.valueOf( integer )
    // 不允许使用可迭代源和不可迭代目标来声明映射方法
    Set<String> integerSetToStringSet(Set<Integer> integers);

    // MapStruct还支持基于Map的映射方法
    @MapMapping(valueDateFormat = "dd.MM.yyyy")
    Map<String, String> longDateMapToStringStringMap(Map<Long, Date> source);


    // 当iterable或map映射方法将接口类型声明为返回类型时，其实现类型之一将在生成的代码中实例化
    //接口类型	        实现类型
    //Iterable	        ArrayList
    //Collection	    ArrayList
    //List	            ArrayList
    //Set	            HashSet
    //SortedSet	        TreeSet
    //NavigableSet	    TreeSet
    //Map	            HashMap
    //SortedMap	        TreeMap
    //NavigableMap	    TreeMap
    //ConcurrentMap	    ConcurrentHashMap
    //ConcurrentNavigableMap	ConcurrentSkipListMap

    // 枚举映射方法
    @ValueMappings({
            // 映射空值到default之中
            @ValueMapping( source = MappingConstants.NULL, target = "DEFAULT" ),
            @ValueMapping(source = "REFUND", target = "REFUND"),
            @ValueMapping(source = "CONSUME", target = "CONSUME"),
            // 映射剩下不为null的值到SPECIAL之中
            @ValueMapping( source = MappingConstants.ANY_REMAINING, target = "SPECIAL" )
    })
    EConvertOrderType convertEnum(EOrderType EOrderType);

    // -------------------列举几个其他的使用形式-------------------
}
